/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.senaclem.atus.vista;

import co.edu.senaclem.logica.AreaLogicaLocal;
import co.edu.senaclem.logica.DependenciaLogicaLocal;
import co.edu.senaclem.logica.FuncionarioLogicaLocal;
import co.edu.senaclem.logica.PersonalLogicaLocal;
import co.edu.senaclem.logica.UsuariosLogicaLocal;
import co.edu.senaclem.modelo.Area;
import co.edu.senaclem.modelo.Dependencia;
import co.edu.senaclem.modelo.Funcionario;
import co.edu.senaclem.modelo.Personal;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.password.Password;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author anfeles
 */
@ManagedBean(name = "funcionarioVista")
@RequestScoped
public class FuncionarioVista {

    @EJB
    private DependenciaLogicaLocal dependenciaLogica;

    @EJB
    private AreaLogicaLocal areaLogica;

    @EJB
    private FuncionarioLogicaLocal funcionarioLogica;

    @EJB
    private PersonalLogicaLocal personalLogica;

    @EJB
    private UsuariosLogicaLocal usuariosLogica;

    private InputText txtIdentificacion;
    private InputText txtNombre;
    private InputText txtApellido;
    private InputText txtCorreo;
    private InputText txtTelefono;
    private SelectOneMenu cmbArea;
    private SelectOneMenu cmbDependencia;
    private Password passClave;
    private CommandButton btnRegistrar;
    private CommandButton btnModificar;
    private CommandButton btnEliminar;
    private CommandButton btnLimpiar;
    private Funcionario selectedFuncionario;
    private List<Funcionario> listaFuncionarios = null;
    private ArrayList<SelectItem> itemsDependencia = null;
    private ArrayList<SelectItem> itemsArea = null;

    public ArrayList<SelectItem> getItemsDependencia() {
        if (itemsDependencia == null) {
            itemsDependencia = new ArrayList<SelectItem>();
            List<Dependencia> lista;
            try {
                lista = dependenciaLogica.consultar(); //llama al factory
                for (int i = 0; i < lista.size(); i++) {
                    itemsDependencia.add(new SelectItem(lista.get(i).getCodigo(), lista.get(i).getNombre()));
                }
            } catch (Exception ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return itemsDependencia;
    }

    public void setItemsDependencia(ArrayList<SelectItem> itemsDependencia) {
        this.itemsDependencia = itemsDependencia;
    }

    public ArrayList<SelectItem> getItemsArea() {
        //se debe llenar al inicio para que se pueda setear mas adelante
        if (itemsArea == null) {
            itemsArea = new ArrayList<SelectItem>();
            List<Area> lista;
            try {
                lista = areaLogica.consultar(); //llama al factory
                for (int i = 0; i < lista.size(); i++) {
                    itemsArea.add(new SelectItem(lista.get(i).getCodigo(), lista.get(i).getNombre()));
                }
            } catch (Exception ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return itemsArea;
    }

    public void setItemsArea(ArrayList<SelectItem> itemsArea) {
        this.itemsArea = itemsArea;
    }

    public InputText getTxtIdentificacion() {
        return txtIdentificacion;
    }

    public void setTxtIdentificacion(InputText txtIdentificacion) {
        this.txtIdentificacion = txtIdentificacion;
    }

    public InputText getTxtNombre() {
        return txtNombre;
    }

    public void setTxtNombre(InputText txtNombre) {
        this.txtNombre = txtNombre;
    }

    public InputText getTxtApellido() {
        return txtApellido;
    }

    public void setTxtApellido(InputText txtApellido) {
        this.txtApellido = txtApellido;
    }

    public InputText getTxtCorreo() {
        return txtCorreo;
    }

    public void setTxtCorreo(InputText txtCorreo) {
        this.txtCorreo = txtCorreo;
    }

    public InputText getTxtTelefono() {
        return txtTelefono;
    }

    public void setTxtTelefono(InputText txtTelefono) {
        this.txtTelefono = txtTelefono;
    }

    public Password getPassClave() {
        return passClave;
    }

    public void setPassClave(Password passClave) {
        this.passClave = passClave;
    }

    public SelectOneMenu getCmbArea() {
        return cmbArea;
    }

    public void setCmbArea(SelectOneMenu cmbArea) {
        this.cmbArea = cmbArea;
    }

    public SelectOneMenu getCmbDependencia() {
        return cmbDependencia;
    }

    public void setCmbDependencia(SelectOneMenu cmbDependencia) {
        this.cmbDependencia = cmbDependencia;
    }

    public CommandButton getBtnRegistrar() {
        return btnRegistrar;
    }

    public void setBtnRegistrar(CommandButton btnRegistrar) {
        this.btnRegistrar = btnRegistrar;
    }

    public CommandButton getBtnModificar() {
        return btnModificar;
    }

    public void setBtnModificar(CommandButton btnModificar) {
        this.btnModificar = btnModificar;
    }

    public CommandButton getBtnEliminar() {
        return btnEliminar;
    }

    public void setBtnEliminar(CommandButton btnEliminar) {
        this.btnEliminar = btnEliminar;
    }

    public CommandButton getBtnLimpiar() {
        return btnLimpiar;
    }

    public void setBtnLimpiar(CommandButton btnLimpiar) {
        this.btnLimpiar = btnLimpiar;
    }

    public Funcionario getSelectedFuncionario() {
        return selectedFuncionario;
    }

    public void setSelectedFuncionario(Funcionario selectedFuncionario) {
        this.selectedFuncionario = selectedFuncionario;
    }

    public List<Funcionario> getListaFuncionarios() {
        if (listaFuncionarios == null) {
            try {
                //System.out.println("Va a consultar los funcionarios");
                setListaFuncionarios(funcionarioLogica.consultar());
            } catch (Exception ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return listaFuncionarios;
    }

    public void setListaFuncionarios(List<Funcionario> listaFuncionarios) {
        this.listaFuncionarios = listaFuncionarios;
    }

    public void onEliminacionConfirm(ActionEvent actionEvent) {
        borrar_action();
    }

    public void onRowSelect(SelectEvent event) {
        //System.out.println("Selecciono el Funcionario");
        if (usuariosLogica.validarSesion()) {
            Funcionario func = (Funcionario) event.getObject();
            //System.out.println("Funcionario Seleccionado" + func.getDocumento().getNombre());
            txtIdentificacion.setValue(func.getDocumento().getDocumento());
            txtNombre.setValue(func.getDocumento().getNombre());
            txtApellido.setValue(func.getDocumento().getApellido());
            txtCorreo.setValue(func.getDocumento().getCorreo());
            txtTelefono.setValue(func.getDocumento().getTelefono());
            cmbDependencia.setValue(func.getArea().getDependencia().getCodigo());
            cmbArea.setValue(func.getArea().getCodigo());

            btnRegistrar.setDisabled(true);
            btnEliminar.setDisabled(false);
            btnModificar.setDisabled(false);
            passClave.setDisabled(true);
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void onDependenciaChange() {
        if (usuariosLogica.validarSesion()) {
            try {
                //System.out.println("onDependenciaChange");
                String dependencia = cmbDependencia.getValue().toString();
                //System.out.println("dependencia seleccionada: " + dependencia);
                itemsArea = new ArrayList<SelectItem>();
                List<Area> lista = areaLogica.consultar(Integer.parseInt(dependencia));
                for (int i = 0; i < lista.size(); i++) {
                    itemsArea.add(new SelectItem(lista.get(i).getCodigo(), lista.get(i).getNombre()));
                }
                setItemsArea(itemsArea);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(FuncionarioDatosVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    public void limpiar_action() {
        //System.out.println("Limpiar registro");
        txtIdentificacion.setValue("");
        txtNombre.setValue("");
        txtApellido.setValue("");
        txtTelefono.setValue("");
        txtCorreo.setValue("");
        cmbArea.setValue("-1");
        cmbDependencia.setValue("-1");
        btnEliminar.setDisabled(true);
        btnModificar.setDisabled(true);
        btnRegistrar.setDisabled(false);
    }

    public void txtIdentificacion_listener() {
        //System.out.println("Entro al listener del Funcionario");
        if (usuariosLogica.validarSesion()) {
            Funcionario func = null;
            Personal entityPersonal = null;
            try {
                Long documentoFuncionario = Long.parseLong(txtIdentificacion.getValue().toString());
                entityPersonal = personalLogica.consultarPorId(documentoFuncionario);
                func = funcionarioLogica.consultarPorId(documentoFuncionario);
            } catch (Exception ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "El Documento debe ser Númerico!"));
            }

            if (entityPersonal == null) //si la persona no existe
            {
                txtNombre.setValue("");
                txtApellido.setValue("");
                txtCorreo.setValue("");
                txtTelefono.setValue("");
                cmbArea.setValue("-1");
                cmbDependencia.setValue("-1");
                passClave.setDisabled(false);
                passClave.setValue("");

                btnRegistrar.setDisabled(false);
                btnEliminar.setDisabled(true);
                btnModificar.setDisabled(true);
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "no");
            } else if (func == null) //si la persona existe pero no como funcionario
            {
                txtNombre.setValue(entityPersonal.getNombre());
                txtApellido.setValue(entityPersonal.getApellido());
                txtCorreo.setValue(entityPersonal.getCorreo());
                txtTelefono.setValue(entityPersonal.getTelefono());
                passClave.setValue(entityPersonal.getClave());
                cmbArea.setValue("-1");
                cmbDependencia.setValue("-1");
                passClave.setDisabled(true);

                btnModificar.setDisabled(true);
                btnEliminar.setDisabled(true);
                btnRegistrar.setDisabled(false);
                //el personal ya existe por tanto guarda el estado en una variable de sesion
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "si");
            } else //si ya existe como funcionario
            {
                txtIdentificacion.setValue(func.getDocumento().getDocumento());
                txtNombre.setValue(func.getDocumento().getNombre());
                txtApellido.setValue(func.getDocumento().getApellido());
                txtCorreo.setValue(func.getDocumento().getCorreo());
                txtTelefono.setValue(func.getDocumento().getTelefono());
                cmbDependencia.setValue(func.getArea().getDependencia().getCodigo());
                cmbArea.setValue(func.getArea().getCodigo());
                btnRegistrar.setDisabled(true);
                passClave.setDisabled(true);

                btnEliminar.setDisabled(false);
                btnModificar.setDisabled(false);
                btnRegistrar.setDisabled(true);
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "si");
            }
        }
        else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void registrar_action() {
        //System.out.println("Registrar Funcionario");

        try {
            Funcionario nuevoFuncionario = new Funcionario();
            Long docFuncionario = Long.parseLong(txtIdentificacion.getValue().toString());
            Personal nuevoPersonal = new Personal();
            nuevoPersonal.setDocumento(docFuncionario);
            nuevoPersonal.setNombre(txtNombre.getValue().toString().toUpperCase());
            nuevoPersonal.setApellido(txtApellido.getValue().toString().toUpperCase());
            nuevoPersonal.setCorreo(txtCorreo.getValue().toString());
            nuevoPersonal.setTelefono(txtTelefono.getValue().toString());
            if (!passClave.isDisabled()) {
                nuevoPersonal.setClave(passClave.getValue().toString());
            }

            String existePersonal = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("existePersonal");
            if (existePersonal.equals("no")) {
                personalLogica.insertar(nuevoPersonal);
            } else {
                personalLogica.modificar(nuevoPersonal);    //por si el usuario cambia algún dato del personal
            }

            Integer area = Integer.parseInt(getCmbArea().getValue().toString());
            Area areaFunc = areaLogica.consultarPorId(area);

            nuevoFuncionario.setDocumento(nuevoPersonal);
            nuevoFuncionario.setArea(areaFunc);
            funcionarioLogica.registrar(nuevoFuncionario);

            limpiar_action();

            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Funcionario se Creó con Exito"));
        } catch (NumberFormatException nfe) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error ", "Número de Documento Inválido"));
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
        }
        setListaFuncionarios(null);

    }

    public void modificar_action() {
        //System.out.println("Modificar Funcionario");
        if (usuariosLogica.validarSesion()) {
            try {
                Long docAprendiz = Long.parseLong(txtIdentificacion.getValue().toString());
                //Modificar       
                Funcionario funcionario = new Funcionario();
                Personal miPersonal = new Personal();
                miPersonal.setDocumento(docAprendiz);
                miPersonal.setNombre(txtNombre.getValue().toString().toUpperCase());
                miPersonal.setApellido(txtApellido.getValue().toString().toUpperCase());
                miPersonal.setCorreo(txtCorreo.getValue().toString());
                miPersonal.setTelefono(txtTelefono.getValue().toString());
                personalLogica.modificar(miPersonal);

                Integer area = Integer.parseInt(getCmbArea().getValue().toString());
                Area areaFunc = areaLogica.consultarPorId(area);

                funcionario.setDocumento(miPersonal);
                funcionario.setArea(areaFunc);
                funcionarioLogica.modificar(funcionario);

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Funcionario se Modificó con Exito"));
            } catch (NumberFormatException nfe) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error ", "Número de Documento Inválido"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }

        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        setListaFuncionarios(null);
    }

    public void borrar_action() {
        //System.out.println("Borrar Funcionario");
        if (usuariosLogica.validarSesion()) {
            try {
                Long docFuncionario = Long.parseLong(txtIdentificacion.getValue().toString());
                //Borrar
                Personal miPersonal = new Personal();
                miPersonal.setDocumento(docFuncionario);
                Funcionario funcionario = new Funcionario();
                funcionario.setDocumento(miPersonal);
                funcionarioLogica.eliminar(funcionario);

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Funcionario se Eliminó con Exito"));
            } catch (NumberFormatException nfe) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error ", "Número de Documento Inválido"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }
            setListaFuncionarios(null);
            limpiar_action();
        }
        else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

}
